//package com.xingkeduo.dao.database;
//
//import java.util.*;
//
//import com.xingkeduo.util.pojo.domain.Page;
//import com.xingkeduo.util.pojo.exception.DataException;
//import com.xingkeduo.util.tool.CommonUtil;
//
//import org.mybatis.spring.SqlSessionTemplate;
//import org.springframework.beans.factory.annotation.Autowired;
//
//import com.xingkeduo.config.CacheConfig;
//import com.xingkeduo.dao.cache.CacheDao;
//import com.xingkeduo.util.pojo.base.BaseQuery;
//import com.xingkeduo.util.pojo.base.BaseTable;
//
///**
// * 数据库对接类
// * 
// * @author GJ
// * @time 2018年12月13日 下午1:45:30
// * @description
// */
//public class DatabaseAccessObject<T extends BaseTable<T>, Q extends BaseQuery<Q>> {
//	private SqlSessionTemplate sqlSession;
//	private CacheDao<T, Q> cacheDao;
//	@Autowired
//	private CacheConfig cacheConfig;
//
//	public DatabaseAccessObject(SqlSessionTemplate sqlSessionTemplate, CacheDao<T, Q> cacheDao) {
//		this.sqlSession = sqlSessionTemplate;
//		this.cacheDao = cacheDao;
//	}
//
//	/**
//	 * 查询实体
//	 * 
//	 * @author GJ
//	 * @time 2016年9月17日 下午1:45:19
//	 * @param id
//	 * @return 单个结果
//	 * @throws Exception
//	 */
//	public T select(String nameSpace, long id) throws Throwable {
//		if (cacheConfig.getCache() != 1)
//			return sqlSession.selectOne(nameSpace + ".selectRow", id);
//
//		T t = cacheDao.getTable(nameSpace, id);
//		if (t != null)
//			return t;
//
//		t = sqlSession.selectOne(nameSpace + ".selectRow", id);
//		cacheDao.setTable(nameSpace, t);
//		return t;
//	}
//
//	/**
//	 * 查询实体
//	 * 
//	 * @author GJ
//	 * @time 2016年9月17日 下午1:45:13
//	 * @param c
//	 * @return 集合
//	 * @throws Exception
//	 */
//	public List<T> select(String nameSpace, Q q) throws Throwable {
//		/**
//		 * 遍历ID集合，移除缓存中存在的ID，并保存在tList中
//		 */
//		List<Long> idList = selectIndex(nameSpace, q);
//		if (idList == null || idList.size() < 1)
//			return Collections.emptyList();
//
//		if (cacheConfig.getCache() != 1)
//			return sqlSession.selectList(nameSpace + ".selectRows", idList);
//
//		List<T> tList = cacheDao.getTable(nameSpace, idList);
//		Map<Long, Integer> map = new HashMap<>();
//		List<Long> subList = new ArrayList<>();
//		for (int i = 0; i < tList.size(); i++) {
//			T t = tList.get(i);
//			if (t != null)
//				continue;
//
//			subList.add(t.getId());
//			map.put(t.getId(), i);
//		}
//
//		/**
//		 * ID集合保留的值从数据库中查询，并按照顺序替换tList中的null值
//		 */
//		if (subList.size() < 1)
//			return tList;
//
//		if (subList.size() > 0) {
//			List<T> partList = sqlSession.selectList(nameSpace + ".selectRows", subList);
//			if (partList != null)
//				return tList;
//
//			for (Iterator<T> iterator = partList.iterator(); iterator.hasNext();) {
//				T t = iterator.next();
//				tList.set(map.get(t.getId()), t);
//			}
//		}
//		return tList;
//	}
//
//	/**
//	 * 查询索引(主键)
//	 * 
//	 * @author GJ
//	 * @time 2016年9月17日 下午1:44:24
//	 * @param c
//	 * @return 几个
//	 * @throws Exception
//	 */
//	public List<Long> selectIndex(String nameSpace, Q q) throws Throwable {
//		if (cacheConfig.getCache() != 1)
//			return sqlSession.selectList(nameSpace + ".selectIndex", q);
//
//		List<Long> idList = cacheDao.getIndex(nameSpace, q);
//		if (idList != null)
//			return idList;
//
//		idList = sqlSession.selectList(nameSpace + ".selectIndex", q);
//		if (idList != null) {
//			Set<Long> tempList = new HashSet<>(idList);
//			idList = new ArrayList<>(tempList);
//			cacheDao.setIndex(nameSpace, q, idList);
//		}
//		return idList;
//	}
//
//	/**
//	 * 统计个数
//	 * 
//	 * @author GJ
//	 * @time 2016年9月17日 下午1:45:07
//	 * @param c
//	 * @return
//	 * @throws Exception
//	 */
//	public int selectCount(String nameSpace, Q q) throws Throwable {
//		if (cacheConfig.getCache() != 1)
//			return sqlSession.selectOne(nameSpace + ".selectCount", q);
//
//		Integer count = cacheDao.getCount(nameSpace, q);
//		if (count != null)
//			return count;
//
//		count = sqlSession.selectOne(nameSpace + ".selectCount", q);
//		if (count == null)
//			count = 0;
//
//		cacheDao.setCount(nameSpace, q, count);
//		return count;
//	}
//
//	/**
//	 * 插入一条记录
//	 * 
//	 * @author GJ
//	 * @time 2016年9月17日 下午1:44:59
//	 * @param d
//	 * @return
//	 * @throws Exception
//	 */
//	public int insert(String nameSpace, T t) throws Throwable {
//		int result = sqlSession.insert(nameSpace + ".insertRow", t);
//		if (result > 0 && cacheConfig.getCache() == 1) {
//			cacheDao.removeCount(nameSpace);
//			cacheDao.removeIndex(nameSpace);
//		}
//		return result;
//	}
//
//	/**
//	 * 插入多条记录
//	 * 
//	 * @author GJ
//	 * @time 2016年9月17日 下午1:44:53
//	 * @param list
//	 * @return
//	 * @throws Exception
//	 */
//	public int insert(String nameSpace, List<T> tList) throws Throwable {
//		int result = sqlSession.insert(nameSpace + ".insertRows", tList);
//		if (result != tList.size())
//			throw new DataException(DataException.Type.FAIL, "批量插入");
//
//		if (cacheConfig.getCache() == 1) {
//			cacheDao.removeCount(nameSpace);
//			cacheDao.removeIndex(nameSpace);
//		}
//		return result;
//	}
//
//	/**
//	 * 修改指定主键的记录
//	 * 
//	 * @author GJ
//	 * @time 2016年9月17日 下午1:44:47
//	 * @param d
//	 * @return
//	 * @throws Exception
//	 */
//	public int update(String nameSpace, T t) throws Throwable {
//		int result = sqlSession.update(nameSpace + ".updateRow", t);
//		if (result > 0 && cacheConfig.getCache() == 1) {
//			cacheDao.setTable(nameSpace, t);
//			cacheDao.removeCount(nameSpace);
//			cacheDao.removeIndex(nameSpace);
//		}
//
//		return result;
//	}
//
//	/**
//	 * 修改多条记录
//	 * 
//	 * @author GJ
//	 * @time 2016年9月17日 下午1:43:29
//	 * @param d
//	 * @param c
//	 * @return
//	 * @throws Exception
//	 */
//	public int update(String nameSpace, T t, Q q) throws Throwable {
//		Map<String, Object> map = new HashMap<String, Object>();
//		map.put("t", t);
//		map.put("q", q);
//
//		String ids = sqlSession.selectOne(nameSpace + ".updateRows", map);
//		if (ids != null && cacheConfig.getCache() == 1) {
//			String[] idArray = ids.split(",");
//
//			List<Long> idList = new ArrayList<Long>();
//			for (int i = 0; i < idArray.length; i++) {
//				if (CommonUtil.isEmpty(idArray[i]))
//					continue;
//				idList.add(Long.parseLong(idArray[i]));
//			}
//
//			if (idList.size() > 0) {
//				cacheDao.removeTable(nameSpace, idList);
//				cacheDao.removeCount(nameSpace);
//				cacheDao.removeIndex(nameSpace);
//			}
//		}
//		return 1;
//	}
//
//	/**
//	 * 分页
//	 * 
//	 * @version id:v0.1
//	 *
//	 * @param q
//	 *            查询条件
//	 * @param pageNo
//	 *            第几页
//	 * @param pageSize
//	 *            每页数量
//	 * @return 返回结果的数据类型 返回结构的描述
//	 */
//	@Deprecated
//	public Page<T> pageSelect(String nameSpace, Q q, Integer pageNo, Integer pageSize) throws Throwable {
//		int count = this.selectCount(nameSpace, q);
//		Page<T> page = new Page();
//		page.setPageSize(pageSize);
//		page.setPageNo(pageNo);
//		page.init(count);
//		if (count == 0) {
//			page.setDtoList(Collections.emptyList());
//		} else {
//			q.setRecordStart(page.getRecordStart());
//			q.setRecordEnd(page.getRecordEnd());
//			page.setDtoList(this.select(nameSpace, q));
//		}
//		return page;
//	}
//}
